/**
 * @file    app_command_process.h
 * @author  yhy
 * @brief   指令处理模块
 * @version 1.00
 * @date    2025-07-26
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef __APP_COMMAND_PROCESS_H__
#define __APP_COMMAND_PROCESS_H__

#include "app_communication.h"
#include "app_massage.h"
#include "common_config.h"

/**
 * @brief 控制信号类型枚举
 *
 */
typedef enum
{
    CONTROL_SIGNAL_TYPE_INVALID  = 0U, /*!< 无效控制信号 */
    CONTROL_SIGNAL_TYPE_VALID    = 1U, /*!< 有效控制信号 */
    CONTROL_SIGNAL_TYPE_UNCHANGE = 2U, /*!< 未改变控制信号 */
} control_signal_type_e;

/**
 * @brief 控制指令ID枚举(每个具体的控制指令)
 *
 */
typedef enum
{
    /* 腰托相关指令 */
    CONTROL_CMD_ID_DR_LUMBAR_F_R_MANUAL_CTRL = 0U, /*!< 主驾腰托前后手动调节 */
    CONTROL_CMD_ID_DR_LUMBAR_U_D_MANUAL_CTRL,      /*!< 主驾腰托上下手动调节 */

    /* 按摩相关指令 */
    CONTROL_CMD_ID_DR_MASSAGE_MODE_CTRL,      /*!< 主驾按摩模式手动调节 */
    CONTROL_CMD_ID_DR_MASSAGE_INTENSITY_CTRL, /*!< 主驾按摩强度手动调节 */
    CONTROL_CMD_ID_DR_MASSAGE_TIME_CTRL,      /*!< 主驾按摩时间手动调节 */
    CONTROL_CMD_ID_DR_MASSAGE_SWITCH_CTRL,    /*!< 主驾按摩开关手动调节 */

    /* 侧翼相关指令 */
    CONTROL_CMD_ID_DR_FLANK_MODE_CTRL, /*!< 主驾侧翼模式手动调节 */

    /* 腿托相关指令 */
    CONTROL_CMD_ID_DR_THIGH_MODE_CTRL, /*!< 主驾腿托模式手动调节 */

    /* 臀部相关指令 */
    CONTROL_CMD_ID_DR_HIP_UP_CTRL,   /*!< 主驾臀部骶骨手动调节 */
    CONTROL_CMD_ID_DR_HIP_DOWN_CTRL, /*!< 主驾臀部软硬手动调节 */

    /* 通风加热相关指令 */
    CONTROL_CMD_ID_DR_VENT_HEAT_MODE_CTRL, /*!< 主驾通风加热模式调节 */

    /* 气袋全开全关指令 */
    CONTROL_CMD_ID_DR_ALL_AIRBAG_CTRL, /*!< TODO 主驾全系统气袋开关(测试用) */

    CONTROL_CMD_ID_MAX,
} control_cmd_id_e;

/**
 * @brief 控制命令结构体
 *
 */
typedef struct
{
    control_cmd_id_e cmd_id;        /*!< 指令ID  */
    uint8_t          current_value; /*!< 当前值 */
    uint8_t          last_value;    /*!< 上次的值 */
    bool             value_changed; /*!< 值是否改变 */
    bool             enabled;       /*!< 指令是否使能 */
} control_command_t;

/* 控制处理器函数指针类型 */
typedef result_e (*control_handler_func_f)(control_cmd_id_e cmd_id, uint8_t command_value);

/**
 * @brief 控制指令映射结构体
 *
 */
typedef struct
{
    control_cmd_id_e       cmd_id;       /*!< 指令ID */
    const char            *cmd_name;     /*!< 指令名称 */
    control_handler_func_f handler_func; /*!< 指令处理函数指针 */
    bool                   enabled;      /*!< 指令是否使能 */
} control_cmd_map_t;

void app_command_process_init(void);
void app_command_process_handle(void);

#endif
